/**
 * 这个节点无法出外部导入json
 * 另外一个 TreeExt 支持 从外部导入
 */
let Node = {

	//类变量和方法
	createNew: function(id, 属性) {
		let self = { id: id, vals: 属性, up: null, children: {} }
		return self;
	},
	add子节点: function(节点, 子节点) {
		if (节点.hasOwnProperty("children")) {
			节点.children[子节点.id] = 子节点
			子节点["up"] = 节点
		}
	},
	del子节点: function(节点, 子节点) {
		if (节点.hasOwnProperty("children")) {
			if (节点.children.hasOwnProperty(子节点.id)) {
				delete 节点["children"][子节点.id]
				子节点 = null
			}
		}
	},
	search: function(节点, 节点id) {
		return this.down直到(节点, function(nd) {
			if (nd.id == 节点id)
				return nd;
			else
				return null;
		})
	},
	downall: function(节点, call) {
		if (节点 == null || call == null) return;
		call(节点);
		for (var key in 节点.children) {
			let 子节点 = 节点.children[key];
			console.log("子节点", key, 子节点)
			this.downall(子节点, call);
		}
	},
	down直到: function(节点, call) {
		if (节点 == null || call == null) return null;
		let flag = call(节点);
		if (flag != null) {          //如果为true 停止遍历
			return 节点;
		}//如果为false 继续遍历
		for (var key in 节点.children) {
			let 子节点 = 节点.children[key];
			let obj = this.down直到(子节点, call);
			if (obj != null) return obj;
		}
		return null;
	},
	upall: function(节点, call) {
		if (节点 == null || call == null) return;
		call(节点)
		this.upall(节点.up, call)
	},
	up直到: function(节点, call) {
		if (节点 == null || call == null) return null;
		// console.log(节点)
		let obj = call(节点)
		if (obj != null)
			return obj;
		return this.up直到(节点.up, call);
	}

}
export default Node;

// let nd = Node.createNew('1', { 姓名: 1 });
// let nd1 = Node.createNew('2', { 姓名: 2 });
// let nd2 = Node.createNew('3', { 姓名: 3 });
// let nd21 = Node.createNew('4', { 姓名: 4 });
// let nd3 = Node.createNew('5', { 姓名: 5 });
// let nd31 = Node.createNew('6', { 姓名: 6 });
// let nd32 = Node.createNew('7', { 姓名: 7 });
// let nd311 = Node.createNew('8', { 姓名: 8 });
// let nd3111 = Node.createNew('9', { 姓名: 9 });

// Node.add子节点(nd, nd1)
// Node.add子节点(nd, nd2)
// Node.add子节点(nd2, nd21)
// Node.add子节点(nd, nd3)
// Node.add子节点(nd3, nd31)
// Node.add子节点(nd3, nd32)
// Node.add子节点(nd31, nd311)
// Node.add子节点(nd311, nd3111)
// Node.downall(nd, function (ndd) {
//     console.log(ndd)
// })
// let ndd = Node.search(nd, '8');
// console.log(ndd)

// let ndd = Node.up直到(nd311, function (nddd) {
//     if (nddd.id == '5') {
//         console.log(nddd)
//         return nddd
//     }    else
//         return null;
// })


// Node.upall(nd3111, function (nddd) {
//     console.log(nddd.id)
// })